package main

import "fmt"

//定义一个公共的结构体
type Ren01 struct {
	name string
	age int
	sex byte
}

//给公共结构体绑定一个函数
func (tmp Ren01) Printinfo()  {
	fmt.Printf("name=%s\tage=%d\tsex=%c\n", tmp.name, tmp.age, tmp.sex)
}

//定义一个子结构体
type Stu01 struct {
	Ren01 //匿名字段，没有数据类型的
	id int
	addr string
}

//在子结构体里定义和父结构体相同名称的方法，叫做方法重写，父子结构体存在同名方法，遵循就近原则
func (tmp Stu01) Printinfo()  {
	fmt.Println("a =", tmp)
}

func main()  {
	//初始化一个Stu01的结构体
	a := Stu01{Ren01{"make", 19, 'm'}, 23, "bj"}
	//直接调用a里面的Printinfo执行的Stu01结构体里的，因为这个是直接属于stu01
	a.Printinfo()
	//要想使用Ren01里面的Printinfo，要加上Ren01，这样就不会调用到重写的方法
	a.Ren01.Printinfo()
}
